package br.org.acessobrasil.portal.facade;

import java.util.List;

import br.org.acessobrasil.facade.FacadeException;
import br.org.acessobrasil.facade.GenericFacade;
import br.org.acessobrasil.portal.modelo.Conteudo;
import br.org.acessobrasil.portal.modelo.InformacaoTipoConteudo;
import br.org.acessobrasil.portal.modelo.Sitio;
import br.org.acessobrasil.portal.modelo.TipoConteudo;
import br.org.acessobrasil.portal.modelo.Usuario;
import br.org.acessobrasil.portal.persistencia.LogDao;

public class TipoConteudoFacade extends GenericFacade<Usuario,TipoConteudo>{
	private LogDao logDao; 
	public LogDao getLogDao() {
		return logDao;
	}
	
	public void setLogDao(LogDao logDao) {
		this.logDao = logDao;
	}
	
	@SuppressWarnings("unchecked")
	public List<TipoConteudo> buscar(Usuario usuarioLogado, Sitio sitio) {
		return getEntityManager().createQuery("Select o from " + TipoConteudo.class.getName() + " o  where o.sitio.nu_sitio=?")
			.setParameter(1,sitio.getNuSitio())
			.getResultList();
	}
	
	private void validar(TipoConteudo tipoConteudo) throws FacadeException{
		if(tipoConteudo.getNoTipoConteudo()==null || tipoConteudo.getNoTipoConteudo().equals("")){
			throw new FacadeException("Por favor, preencha o campo nome.");
		}
		if(tipoConteudo.getSitio()!=null){
			tipoConteudo.setNuSitio(tipoConteudo.getSitio().getNuSitio());
		}
		if(tipoConteudo.getNuSitio()==null){
			throw new FacadeException("nuSitio == null.");
		}
	}
	
	@Override
	public TipoConteudo atualizar(Usuario ator, TipoConteudo tipoConteudo) throws FacadeException {
		validar(tipoConteudo);
		logDao.addLog(ator, "Editou o tipo de conteudo [id=" + tipoConteudo.getNuTipoConteudo()+" nome="+tipoConteudo.getNoTipoConteudo()+"]");
		return super.atualizar(ator, tipoConteudo);
	}
	
	@Override
	public void criar(Usuario ator, TipoConteudo tipoConteudo) throws FacadeException {
		validar(tipoConteudo);
		super.criar(ator, tipoConteudo);
		logDao.addLog(ator, "Criou o tipo de conteudo [id=" + tipoConteudo.getNuTipoConteudo()+" nome="+tipoConteudo.getNoTipoConteudo()+"]");
	}

	@SuppressWarnings("unchecked")
	public List<Conteudo> buscarConteudosDoTipo(Long nuTipoConteudo){
		return getEntityManager().createQuery("Select o from "+Conteudo.class.getName() + " o where o.nu_tipo_conteudo=?")
		.setParameter(1,nuTipoConteudo)
		.getResultList();
	}
	
	@Override
	public void excluir(Usuario ator, TipoConteudo tipoConteudo) throws FacadeException {
		tipoConteudo = buscar(ator, tipoConteudo.getNuTipoConteudo());
		List<Conteudo> conteudos = buscarConteudosDoTipo(tipoConteudo.getNuTipoConteudo()); 
		if(conteudos.size()>0){
			throw new FacadeException("Este tipo possui conte&uacute;dos cadastrados, n&atilde;o &eacute; poss&iacute;vel apagar.");
		}
		if(tipoConteudo.getListInformacaoTipoConteudo().size()>0){
			for(int i=0;i<tipoConteudo.getListInformacaoTipoConteudo().size();i++){
				InformacaoTipoConteudo info = tipoConteudo.getListInformacaoTipoConteudo().get(i);
				getEntityManager().remove(info);
			}
		}
		super.excluir(ator, tipoConteudo);
		logDao.addLog(ator, "Apagou o tipo de conteudo [id=" + tipoConteudo.getNuTipoConteudo()+" nome="+tipoConteudo.getNoTipoConteudo()+"]");
	}
}
